/**
 * @File Name: buffer.h
 * @brief  Buffer类: 缓冲区
 * @Author : beyon_sir email:caoboyang.chn@gmail.com
 * @Version : 1.0
 * @Create Date : 2022-11-20
 * 
 */
#ifndef BUFFER_H
#define BUFFER_H
#include <cstring>   //perror
#include <iostream>
#include <unistd.h>  // write
#include <sys/uio.h> //readv
#include <vector> //readv
#include <atomic>
#include <assert.h>

/// @brief 缓冲区(保存请求和响应报文)
class Buffer {
public:
    Buffer(int initBuffSize = 1024);        // 初始化缓冲区(默认大小为1024)
    ~Buffer() = default;

    size_t WritableBytes()      const;      // 可写的字节数
    size_t ReadableBytes()      const;      // 可读的字节数
    size_t PrependableBytes()   const;      // 可扩展的字节数

    const char* Peek() const;
    void EnsureWriteable(size_t len);       // 确保可以写
    void HasWritten(size_t len);            // 写入一些数据后 更新当前写的位置writePos_

    void Retrieve(size_t len);
    void RetrieveUntil(const char* end);

    void RetrieveAll() ;
    std::string RetrieveAllToStr();

    const char* BeginWriteConst() const;
    char* BeginWrite();

    void Append(const std::string& str);
    void Append(const char* str, size_t len);
    void Append(const void* data, size_t len);
    void Append(const Buffer& buff);

    ssize_t ReadFd(int fd, int* Errno);
    ssize_t WriteFd(int fd, int* Errno);

private:
    char* BeginPtr_();                          // 开始读的指针
    const char* BeginPtr_() const;             
    void MakeSpace_(size_t len);                // 创建新的空间(如果空间不足)

    std::vector<char> buffer_;                  // 具体存储数据的vector
    std::atomic<std::size_t> readPos_;          // 当前读的位置
    std::atomic<std::size_t> writePos_;         // 当前写的位置
};

#endif //BUFFER_H